#include "ShaderBuilder.h"


ShaderBuilder::ShaderBuilder()
{
}

ShaderBuilder::~ShaderBuilder()
{
}

void ShaderBuilder::checkError(GLuint shader, GLbyte status)
{
	GLint success;
	GLchar infoLog[512];
	glGetShaderiv(shader, status, &success);
	if (!success)
	{
		glGetShaderInfoLog(shader, 512, NULL, infoLog);
		std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
	}
}

GLuint ShaderBuilder::buildShaderProgram(const GLchar* vertexShaderSource, const GLchar* fragmentShaderSource)
{
	//-----------------------顶点程序的加载--------------------------------
	// gpu 创建顶点程序
	GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
	// 加载着色器代码：顶点程序代码
	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
	// 编译（配置）
	glCompileShader(vertexShader);
	// 检查编译错误
	checkError(vertexShader, GL_COMPILE_STATUS);

	//-----------------------片元程序的加载--------------------------------
	// gpu 创建片元程序
	GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	// 加载着色器代码：片元程序
	glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
	// 编译（配置）
	glCompileShader(fragmentShader);
	// 检查事件错误
	checkError(fragmentShader, GL_COMPILE_STATUS);

	//-----------------------创建处理程序--------------------------------
	// shaderProgram 程序表示，pid，此时是一个空的大程序，然后把顶点和片元添加进来
	GLuint shaderProgram = glCreateProgram();
	// 合并shader 顶点与片元程序，创建处理程序
	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);
	// 告诉GPU链接程序
	glLinkProgram(shaderProgram);
	// 检查链接错误
	checkError(shaderProgram, GL_LINK_STATUS);

	//-----------------------清理顶点与片元程序--------------------------------
	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);

	return shaderProgram;
}
